异步PostExecute

时间:2014-09-29 13:31:49

标签: java android android-asynctask

我已经能够在我的套接字服务器(在ruby上运行)和我的客户端(这是一个Android(java)应用程序)之间建立连接。我将解释我的目标是什么。

我必须通过套接字将字符串发送到我的服务器。根据字符串的内容,服务器将执行数据库中的进程(存储,删除,查看数据等)。

第一个选项是验证用户名/密码。我能够发送正确的字符串,服务器接收它并回复给我正确的响应(在验证我的用户名是否能够登录到应用程序之后)。现在,根据此响应,我需要使用下一个活动(MenuActivity)更改当前活动(loginActivity),以便用户可以继续使用应用程序菜单。

由于套接字必须在UIThread以外的其他线程上运行,所以我使用AsyncTask方式运行它。但是,在AsyncTask进程结束后,我遇到了触发活动更改的问题。

我正在做的是,在整个异步任务完成后(onPostExecute方法)我试图调用该活动,但它无法正常工作。这就是我所尝试的(基于我在研究期间发现的类似案例):

(AsyncTask类)

Context context;
private void AppContext(Context context) {
    this.context = context.getApplicationContext();
}

OnPostExecute

Intent NewActivity = new Intent();
NewActivity.setClass(context.getApplicationContext(),MainActivity.class);
context.startActivity(NewActivity);

然而,这不起作用,它导致我的应用程序崩溃了一个"线程令人兴奋的未被捕获的异常"

我试过只显示一条Toast信息,上面写着" Granted"或"拒绝"只是为了测试它有一个更简单的任务,但我一直得到相同的错误,所以我假设它与处理运行异步任务的线程和UI线程之间的变化有关。有什么想法吗?

P.S:我已经检查过与我类似的其他问题,并尝试了建议的代码,但没有任何工作。

错误日志

09-29 09:59:11.387: E/AndroidRuntime(2856): FATAL EXCEPTION: main
09-29 09:59:11.387: E/AndroidRuntime(2856): java.lang.NullPointerException
09-29 09:59:11.387: E/AndroidRuntime(2856):     at com.example.prescoterm.SocketClass.onPostExecute(SocketClass.java:111)
09-29 09:59:11.387: E/AndroidRuntime(2856):     at com.example.prescoterm.SocketClass.onPostExecute(SocketClass.java:1)
09-29 09:59:11.387: E/AndroidRuntime(2856):     at android.os.AsyncTask.finish(AsyncTask.java:602)
09-29 09:59:11.387: E/AndroidRuntime(2856):     at android.os.AsyncTask.access$600(AsyncTask.java:156)
09-29 09:59:11.387: E/AndroidRuntime(2856):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
09-29 09:59:11.387: E/AndroidRuntime(2856):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-29 09:59:11.387: E/AndroidRuntime(2856):     at android.os.Looper.loop(Looper.java:137)
09-29 09:59:11.387: E/AndroidRuntime(2856):     at android.app.ActivityThread.main(ActivityThread.java:4424)
09-29 09:59:11.387: E/AndroidRuntime(2856):     at java.lang.reflect.Method.invokeNative(Native Method)
09-29 09:59:11.387: E/AndroidRuntime(2856):     at java.lang.reflect.Method.invoke(Method.java:511)
09-29 09:59:11.387: E/AndroidRuntime(2856):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-29 09:59:11.387: E/AndroidRuntime(2856):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-29 09:59:11.387: E/AndroidRuntime(2856):     at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:1)

好的,所以我找到了一个解决方法,现在我想听听你们,如果你认为这是一个合适的解决方案。

由于问题是我的AsyncTask类的上下文是空的,所以我决定从应用程序启动的那一刻起加载一个变量的值。

context = this.getApplicationContext(); 
new SocketReception().setContext(context);

在我的SocketReception类中,我有一个setContext(context)方法。

public void setContext(Context context) 
    {
        SocketReception.appContext= context;
    };

现在,在我的AsyncTask post.execute上,我调用了这样的新活动:

SocketReception.appContext.startActivity(NewActivity);

它现在正在工作,但我想知道这是否是一种方便的方法,或者我是否应该继续寻找不同的解决方案。

P.S:我不得不添加不受欢迎的" FLAG_ACTIVITY_NEW_TASK",将研究如何在以后避免这种情况。

答案 1 :(得分:0)

我在活动中直接使用了这个asynctask并且工作正常,可能会有所帮助。当我尝试调用Intent i = new Intent(getApplicationContext(),VyberIcoActivitySD.class);在没有上下文的类中(类扩展而不是Activity,Fragment ......)我没有结果......

class SynchroAllIcosSD extends AsyncTask<String, String, String> {


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(SynchroIcoActivitySD.this);
        pDialog.setMessage(getString(R.string.progdata));
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }


    protected String doInBackground(String... args) {

    //do something

        return null;
    }


    protected void onPostExecute(String file_url) {
        // dismiss the dialog after getting all products
        pDialog.dismiss();
        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {


                Intent i = new Intent(getApplicationContext(), VyberIcoActivitySD.class);
                Bundle extras = new Bundle();
                extras.putString("odkade", "100");
                extras.putString("page", "1");
                i.putExtras(extras);
                startActivity(i);
                finish();

            }
        });

    }

}