如何在getDataTaskmethod中显示toast?

时间:2013-08-14 19:30:41

标签: android

这是我的代码下面哪个工作完全唯一的问题是没有显示toast消息代码是爆炸我想要显示toast mesage如果状态为0在这一行if(status.equals(“1”))  显示吐司消息,但代码是爆炸,如果我评论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();
    }
}

 }

2 个答案:

答案 0 :(得分:0)

用这个

围绕你的祝酒词
runOnUiThread(new Runnable() {
public void run() {

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

答案 1 :(得分:0)

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

您无法从后台线程更新用户界面线程。

这里有两个选择

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

2)由于你的方法已经完成了这一点,然后让parseJsonData将整数变量设置为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/

你应该知道方向的变化以及它将如何影响你的asynctask(我通过使用片段避免了这个问题

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

但是对于处理Web服务,对你的用户很好,让android系统在下载数据等时运行,不要耗尽电池并使用带有intentservice而不是asynctask的同步适配器。已经有太多糟糕的应用程序采用asynctask方法来使用Web服务。请不要将您的内容添加到列表中

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

这是一个额外的学习曲线,但你的程序员对吗?您应该为用户提供最佳体验。

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