Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在AsyncHttpResponseHandler中编辑GUI_Android_Multithreading_Android Asynctask - Fatal编程技术网

Android 在AsyncHttpResponseHandler中编辑GUI

Android 在AsyncHttpResponseHandler中编辑GUI,android,multithreading,android-asynctask,Android,Multithreading,Android Asynctask,我正试图根据从我的AsyncHttpResponseHandler得到的响应来编辑GUI,但是我遇到了线程权限方面的问题 这是我的onCreate方法 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final ProgressDialog r

我正试图根据从我的
AsyncHttpResponseHandler
得到的响应来编辑GUI,但是我遇到了线程权限方面的问题

这是我的
onCreate
方法

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final ProgressDialog ringProgressDialog = ProgressDialog.show(
            MainActivity.this, "Please wait ...", "Setting up network...",
            true);
    ringProgressDialog.setCancelable(true);
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                setUpNetwork();
                Thread.sleep(5000);
                GetList getList = new GetList(
                        getApplicationContext());
                getList.execute();

            } catch (Exception e) {

            }
            ringProgressDialog.dismiss();
        }
    }).start();
}
setUpNetwork
为我提供了
AsyncTask
应该发送到的IP地址,因此
AsynTask
在完成之前不能启动非常重要

我的
GetList
如下所示

private class GetList extends AsyncTask<Void, Void, Void> {

    Context context;

    public GetList(Context applicationContext) {
        context = applicationContext;
    }

    @Override
    protected String doInBackground(Void... params) {
        // this stores my list in a static way so I can access it across my Activities
        User u = StaticVars.getUserList().get(0);
        tblLayout = (TableLayout) findViewById(R.id.song_list_table);
        AsyncHttpClient client = new AsyncHttpClient();
        client.post(context, url, entity, contentType, new AsyncHttpResponseHandler() {

            @Override
            public void onSuccess(int statusCode, Header[] headers,
                    byte[] responseBody) { 
                Log.d(TAG, "Successfully got a response: "
                        + new String(responseBody));
                String response = new String(responseBody);

                TextView tv = new TextView(context);
                tv.setText(response);
                TableRow tr = new TableRow(context);
                tr.addView(tv);
                tblLayout.addView(tr);

            }
        }
    }
}

这是一个主要的设计缺陷还是有什么方法可以修复?

您可以在
AsyncHttpResponseHandler
中调用
runOnUiThread
,或者存储视图并将其添加到AsyncTasks覆盖方法
onPostExecute(结果结果)
。我不确定AsyncHttpResponseHandler是如何工作的,因此您可能必须使用runOnUiThread而不是正确的
onPostExecute
方法

01-02 22:01:00.454: E/AndroidRuntime(7905): FATAL EXCEPTION: AsyncTask #1
01-02 22:01:00.454: E/AndroidRuntime(7905): java.lang.RuntimeException: An error occured while executing doInBackground()
01-02 22:01:00.454: E/AndroidRuntime(7905):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at java.lang.Thread.run(Thread.java:841)
01-02 22:01:00.454: E/AndroidRuntime(7905): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that    created a view hierarchy can touch its views.
01-02 22:01:00.454: E/AndroidRuntime(7905):     at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6804)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1077)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at android.view.View.requestLayout(View.java:16775)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at android.view.View.requestLayout(View.java:16775)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at android.view.View.requestLayout(View.java:16775)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at android.view.View.requestLayout(View.java:16775)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at android.view.View.requestLayout(View.java:16775)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at android.widget.TableLayout.requestLayout(TableLayout.java:230)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at android.view.ViewGroup.addView(ViewGroup.java:3608)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at android.widget.TableLayout.addView(TableLayout.java:429)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at android.view.ViewGroup.addView(ViewGroup.java:3555)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at android.widget.TableLayout.addView(TableLayout.java:411)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at android.view.ViewGroup.addView(ViewGroup.java:3531)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at android.widget.TableLayout.addView(TableLayout.java:402)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at com.app.main.MainActivity$GetList.doInBackground(MainActivity.java:295)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at com.app.main.MainActivity$GetList.doInBackground(MainActivity.java:1)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
01-02 22:01:00.454: E/AndroidRuntime(7905):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
01-02 22:01:00.454: E/AndroidRuntime(7905):     ... 4 more