-5

这是我下面的代码,它完美地工作唯一的问题是不显示 toast 消息代码是爆炸我想显示 toast 消息如果状态为 0 在这一行 if (status.equals("1")) 显示 toast 消息但代码是爆炸如果我评论 Toast 然后代码运行完美帮助我我该怎么办?

        public class thirdstep extends Activity {


ListView listCategory;

String status;
String message;
String MenuSelect;
ProgressBar prgLoading;
long Cat_ID;
String Cat_name;

String CategoryAPI;
int IOConnect = 0;
TextView txtAlert;
thirdstepAdapter cla;
static ArrayList<String> Category_ID = new ArrayList<String>();
static ArrayList<String> Category_name = new ArrayList<String>();
static ArrayList<String> Category_image = new ArrayList<String>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.category_list2);
    ImageButton btnback = (ImageButton) findViewById(R.id.btnback);
    listCategory = (ListView) findViewById(R.id.listCategory2);
       prgLoading = (ProgressBar) findViewById(R.id.prgLoading);
       txtAlert = (TextView) findViewById(R.id.txtAlert);
    cla = new thirdstepAdapter(thirdstep.this);

    new getDataTask().execute();

    listCategory.setAdapter(cla);

    btnback.setOnClickListener(new OnClickListener()

    {

        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            finish();
        }
    });

    Intent iGet = getIntent();
    Cat_ID = iGet.getLongExtra("category_id", 0);
    Cat_name = iGet.getStringExtra("category_name");

    Toast.makeText(this, Cat_ID + Cat_name, Toast.LENGTH_SHORT).show();

    MenuSelect = Utils.MenuSelect;

    listCategory.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> arg0, View arg1,
                int position, long arg3) {
            // TODO Auto-generated method stub
            Intent iMenuList = new Intent(thirdstep.this,   
                      fourthscreen.class);


            iMenuList.putExtra("Cat_ID",Cat_ID);
            iMenuList.putExtra("Menuitem", Category_ID.get(position));


            startActivity(iMenuList);

        }
    });



}

void clearData() {
    Category_ID.clear();
    Category_name.clear();
    Category_image.clear();
}





 public class getDataTask extends AsyncTask<Void, Void, Void>{

        getDataTask(){
            if(!prgLoading.isShown()){
                prgLoading.setVisibility(0);
                txtAlert.setVisibility(8);
            }
        }

        @Override
         protected void onPreExecute() {
          // TODO Auto-generated method stub

        }

        @Override
        protected Void doInBackground(Void... arg0) {
            // TODO Auto-generated method stub
            parseJSONData();
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            prgLoading.setVisibility(8);
            if((Category_ID.size() > 0) || IOConnect == 0){
                listCategory.setVisibility(0);
                listCategory.setAdapter(cla);
            }else{
                txtAlert.setVisibility(0);
            }
        }
    }

public void parseJSONData() {


    CategoryAPI = Utils.MenuList + Cat_ID;

    clearData();
    try {

        HttpClient client = new DefaultHttpClient();
        HttpConnectionParams
                .setConnectionTimeout(client.getParams(), 15000);
        HttpConnectionParams.setSoTimeout(client.getParams(), 15000);
        HttpUriRequest request = new HttpGet(CategoryAPI);
        HttpResponse response = client.execute(request);
        InputStream atomInputStream = response.getEntity().getContent();
        BufferedReader in = new BufferedReader(new InputStreamReader(
                atomInputStream));

        String line;
        String str = "";
        while ((line = in.readLine()) != null) {
            str += line;
        }

        JSONObject json = new JSONObject(str);

        JSONObject json2 = new JSONObject(str);


        status = json2.getString("status");
        message = json2.getString("message");

        if (status.equals("1")) {

        JSONObject data = json.getJSONObject("data");

        JSONArray school = data.getJSONArray("menu_groups");




        for (int i = 0; i < school.length(); i++) {
            JSONObject object = school.getJSONObject(i);

            Category_ID.add(object.getString("id"));
            Category_name.add(object.getString("title"));
            Category_image.add(object.getString("image"));

        }

        }
        else    
        {

            Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
        }

    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        IOConnect = 1;
        e.printStackTrace();
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

 }
4

2 回答 2

0

用这个包围你的吐司

runOnUiThread(new Runnable() {
public void run() {

    Toast.makeText(getBaseContext(), message, Toast.LENGTH_SHORT).show();
    }
});
于 2013-08-14T19:54:08.053 回答
0

您的 toast 消息位于从 asynctask 的 doInBackground 方法调用的 parseJsonData 方法中。

您不能从后台线程更新用户界面线程。

你在这里有两个选择

1)您可以发布publishProgress(1)线程的进度,传入一个整数值用作一个标志,您可以在 onPublishProgress 侦听器中获取该标志并在那里显示您的吐司

或者

2)由于您的方法此时已完成,然后将parseJsonDataset 设置为 asynctask 全局的整数变量,并在onPostExecute方法中将某些内容传递回侦听器以指示需要显示 toast

根据评论更新

代替

  {
      Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
  }

  {
      publishProgress(1);
  }

将缺少的 onProgressUpdate() 方法添加到您的 asynctask

@Override
protected void onProgressUpdate(Integer... percent) {
  //Call your listeners.onProgressUpdate(percent) here and show the
  //Or
  super.onProgressUpdate(percent);
  if (percent[0] == 1){
     Toast.makeText(thirdstep.this, message, Toast.LENGTH_SHORT).show();
  }
}

我不是来为你写代码的。对如何正确编写异步任务和发布进度进行一些研究

这是一个很好的起点 http://androidresearch.wordpress.com/2012/03/17/understanding-asynctask-once-and-forever/

您应该注意方向更改以及这将如何影响您的异步任务(我通过使用片段来避免这种情况的陷阱

这是我用于异步任务的设计模式 http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

但是对于处理 Web 服务,请善待您的用户,让 android 系统确定何时下载数据等,不要耗尽他们的电池,并使用带有 intentservice 而不是 asynctask 的同步适配器。已经有太多糟糕的应用程序采用异步任务方法来使用 Web 服务。请不要将您的添加到列表中

这样做 http://developer.android.com/training/sync-adapter/creating-sync-adapter.html

这是很多额外的学习曲线,但是您是程序员,对吗?你应该给你的用户最好的体验。

顺便说一句,您正在投票,因为您要求为您编写代码。我希望这只是语言障碍而不是态度问题。

于 2013-08-14T20:02:32.457 回答