2014-09-29 42 views
0

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

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

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

由于套接字必须在除UIThread之外的其他线程上运行,所以即使使用AsyncTask方式运行它。然而,即使在AsyncTask过程结束后触发活动改变的问题仍然存在。

即时通讯工作是在整个异步任务完成后(onPostExecute方法)即时通讯尝试调用活动,但它不工作。这是我试过(基于类似的情况下,我一直在研究过程中发现的):

(的AsyncTask类)

​​

OnPostExecute

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

但是这是不工作及其导致我的应用崩溃与“未使用的异常令人兴奋”线程

我试着只显示说“授予”或“拒绝”的Toast消息只是为了测试一个更简单的任务,但我仍然得到相同的错误,所以即时通讯假设它处理Async任务正在运行的线程和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) 
+0

从你正在使用来自服务,活动或来自类 – 2014-09-29 13:39:45

+0

的异步任务我有一个名为SocketClass的类。在我的登录活动中,当我点击“提交”按钮时,这就是我的异步任务启动的地方:new SocketClass()。execute((“@ | 01 |”+ user +“|”+ password).split(“\\ |“)); – 2014-09-29 13:42:28

+0

为什么ru把所有的东西放在postexecute.Do在后台执行webservice调用,并在post执行中调用actvity,并且使用上下文,就像你从构造函数中获得的一样,不需要调用context.getApplcationContext() 。 – 2014-09-29 13:45:25

回答

0

我在活动直接使用此的AsyncTask,做工精细,可能的帮助。当我尝试调用意图我=新的意图(getApplicationContext(),VyberIcoActivitySD.class);在没有上下文类(类扩展不活动,片段...)我还没有造成...

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(); 

      } 
     }); 

    } 

} 
+0

它提示我创建一个方法runOnUiThread ..但我假设postExecute它在UIThread中运行,所以没有必要这样做,我错了吗? – 2014-09-29 18:51:28

+0

当我从后台更新UI时,我需要runOnUiThread – eurosecom 2014-09-30 07:07:30

1

行,所以我找到了一个解决办法这一点,现在我想从你们那里听到的话,你觉得这'd是一个合适的解决方案。

由于问题是上下文在我的AsyncTask类中出现null,我决定从应用程序启动的那一刻起将值加载到变量上。

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

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

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

现在,在我的AsyncTask文章。执行我所说的新的活动是这样的:

SocketReception.appContext.startActivity(NewActivity); 

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

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