2016-11-12 48 views
0

我正在尝试运行此脚本,但在doInBackground()中的某处正在启动回到开始活动。运行类时,应用程序转到MainActivity

(我试图做的是扫描所有可用的SSID的,并检查他们的数据库)

这里是我的代码:

Button btnHit; 
TextView txtJson; 
private static final String TAG = "My Activity"; 

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

    btnHit = (Button) findViewById(R.id.request); 
    txtJson = (TextView) findViewById(R.id.results); 


    if (Build.VERSION.SDK_INT > 22) { 

     final String CoarseLocation = Manifest.permission.ACCESS_COARSE_LOCATION; 
     final String AccessWifi = Manifest.permission.ACCESS_WIFI_STATE; 
     final String ChangeWifi = Manifest.permission.CHANGE_WIFI_STATE; 

     if (checkSelfPermission(CoarseLocation) != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 123); 
     } 

     if (checkSelfPermission(AccessWifi) != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(new String[]{Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.ACCESS_WIFI_STATE}, 123); 
     } 

     if (checkSelfPermission(ChangeWifi) != PackageManager.PERMISSION_GRANTED) { 
      requestPermissions(new String[]{Manifest.permission.CHANGE_WIFI_STATE, Manifest.permission.CHANGE_WIFI_STATE}, 123); 
     } 
    } 



    LocationManager lman = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE); 
    boolean network_enabled = false; 

    try 
    { 
     network_enabled = lman.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
    } catch (Exception ex) {} 


    if (!network_enabled) 
    { 
     startActivityForResult(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS), 0); 
    } 



    final WifiManager mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE); 

    mWifiManager.setWifiEnabled(true); 

    IntentFilter filter = new IntentFilter(); 
    filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 

    registerReceiver(new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      List<ScanResult> results = mWifiManager.getScanResults(); 
      final int Amount = results.size(); 

      Log.v(TAG, "Wifi Scan Results Count: " + Amount); 

      int num = 0; 

      while (num < Amount) 
      { 
       Log.v(TAG, "SSID = " + results.get(num).SSID); 

       num = num+1; 
      } 

      int dis = 0; 

      String res = "Results:\n\n\n"; 

      while (dis < Amount) 
      { 
       res = res + results.get(dis).SSID + "\n\n"; 

       String surl = "http://myurl.com?ssid=" + results.get(dis).SSID; 
       new JsonTask().execute(surl); 

       dis = dis+1; 
      } 

      TextView textres = (TextView) findViewById(R. id. resnet); 
      textres.setText(res); 

     } 
    }, filter); 

    mWifiManager.startScan(); 

} 



private class JsonTask extends AsyncTask<String, String, String> { 

    ProgressDialog pd; 

    protected void onPreExecute() { 
     super.onPreExecute(); 

     pd = new ProgressDialog(FindConnection.this); 
     pd.setMessage("Please wait"); 
     pd.setCancelable(false); 
     pd.show(); 
    } 

    protected String doInBackground(String... params) { 


     HttpURLConnection connection = null; 
     BufferedReader reader = null; 

     try { 
      URL url = new URL(params[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.connect(); 


      InputStream stream = connection.getInputStream(); 

      reader = new BufferedReader(new InputStreamReader(stream)); 

      StringBuffer buffer = new StringBuffer(); 
      String line = ""; 

      while ((line = reader.readLine()) != null) { 

       buffer.append(line+"\n"); 

       if (line != "null") 
       { 
        Toast.makeText(getApplicationContext(), "Found one...", Toast.LENGTH_SHORT).show(); 
       } 

       Log.d("Response: ", "> " + line); 

      } 

      return buffer.toString(); 


     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (connection != null) { 
       connection.disconnect(); 
      } 
      try { 
       if (reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     if (pd.isShowing()){ 
      pd.dismiss(); 
     } 
     txtJson.setText(result); 
    } 
} 

而这里的错误,我得到:

11-12 19:48:56.920 21711-21811/com.comhet.comhet E/AndroidRuntime: 
FATAL EXCEPTION: AsyncTask #1 
Process: com.comhet.comhet, PID: 21711 
java.lang.RuntimeException: An error occurred while executing doInBackground() 
    at android.os.AsyncTask$3.done(AsyncTask.java:309) 
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
    at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
    at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.RuntimeException: Can't create handler inside thread 
that has not called Looper.prepare() 
    at android.os.Handler.<init>(Handler.java:200) 
    at android.os.Handler.<init>(Handler.java:114) 
    at android.widget.Toast$TN.<init>(Toast.java:362) 
    at android.widget.Toast.<init>(Toast.java:109) 
    at android.widget.Toast.makeText(Toast.java:276) 
    at com.comhet.comhet.FindConnection$JsonTask.doInBackground(FindConnection.java:194) 
    at com.comhet.comhet.FindConnection$JsonTask.doInBackground(FindConnection.java:156) 
    at android.os.AsyncTask$2.call(AsyncTask.java:295) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)  
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
    at java.lang.Thread.run(Thread.java:818) 
+0

您可能会发现,[其他HTTP库(http://stackoverflow.com/questions/16902716/comparison-of-android-networking-libraries-okhttp-改装凌空)比AsyncTask更容易处理 –

+0

你可能是对的。我用AsyncTask做了这个,因为我在网上找到了这个教程。这是唯一一个为我工作的人。 –

+0

那么'line!=“null”'不是你比较Java字符串的方式。你不能在'doInBackground'里面吐司,所以如果你的教程有这些,那就不对了。 –

回答

1

您试图在AsyncTask的doInBackground()方法中显示Toast。这是不允许的,因为doInBackground()方法在后台线程上运行,并且无法执行与UI线程相关的操作。

如果要检查返回的值,请记录返回值或在onPostExecute()方法内创建Toast。

0

“)引起:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程中创建处理程序”

您不能在未调用Looper.prepare的线程上创建处理程序。主线程已经为你调用。如果要发布到主线程,则需要在主线程上创建比处理程序更多的处理程序。

0

看看你的doInBackground方法
你不能在doInBackground中做UI相关的操作。它应该在onPostExecute {}方法中完成。

从doInBackground删除此:

while ((line = reader.readLine()) != null) { 

      buffer.append(line+"\n"); 

      if (line != "null") 
      { 
       Toast.makeText(getApplicationContext(), "Found one...", Toast.LENGTH_SHORT).show(); 
      } 

      Log.d("Response: ", "> " + line); 

     } 
}