2015-08-05 3 views
-3

Я новичок в разработке Android.
Я следую онлайн-уроку.
В настоящее время я изучаю темы.Ошибка приложения при вызове InputStream

Я пробовал комментировать и поджаривать в следующем коде, чтобы найти свою ошибку.
Я предполагаю, что ошибка указана в строке inputStream = connection.getInputStream();.
Если я прокомментирую эту строку и цикл while, приложение будет работать плавно.

Пожалуйста, помогите.

package com.example.vivzmultithreadingexample; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.EditText; 
import android.widget.LinearLayout; 
import android.widget.ListView; 
import android.widget.ProgressBar; 
import android.widget.Toast; 

public class MainActivity extends Activity implements OnItemClickListener { 

    private EditText editText; 
    private ListView listView; 
    private String[] listofImages; 
    private ProgressBar progessBar; 
    private LinearLayout loadingSection = null; 


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

     editText = (EditText) findViewById(R.id.editText1); 
     listView = (ListView) findViewById(R.id.urlList); 
     listView.setOnItemClickListener(this); 
     listofImages = getResources().getStringArray(R.array.imageUrls); 
     progessBar = (ProgressBar) findViewById(R.id.downloadProgress); 
    } 



    public void downloadImage(View v){ 
     //Toast.makeText(this, "button Clicked", Toast.LENGTH_SHORT).show(); 
     Thread myThread = new Thread(new DownloadImagesThread()); 
     myThread.run(); 
    } 

    public boolean downloadImageUsingThread(String url){ 


     boolean sucessful = false; 
     URL downloadUrl = null; 
     HttpURLConnection connection= null; 
     InputStream inputStream = null; 

     try { 
      downloadUrl = new URL(url); 
      connection =(HttpURLConnection) downloadUrl.openConnection(); 
      inputStream = connection.getInputStream(); 
      int read = -1; 
      while((read =inputStream.read()) !=-1){ 
       L.m(""+read); 
      } 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      L.m(""+e); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      L.m(""+e); 

     }finally{ 
      if(connection != null){ 
       connection.disconnect(); 
      } 

      if(inputStream != null){ 
       try { 
        inputStream.close(); 
       } catch (IOException e) { 
        L.m(""+e); 
        // TODO Auto-generated catch block 
            } 
      } 
     } 
     Toast.makeText(this, connection.toString(), Toast.LENGTH_SHORT).show(); 
     return sucessful; 
    } 


    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     editText.setText(listofImages[arg2]); 

    } 

    public class DownloadImagesThread implements Runnable { 
     public void run() { 
      downloadImageUsingThread(listofImages[0]); 
      editText.setText(listofImages[0]); 


     } 
    } 
} 

Logcat:

08-05 09:52:45.082: D/BstCommandProcessor-Application(1928): Application crash has been observed. 
08-05 09:52:45.082: I/Process(9680): Sending signal. PID: 9680 SIG: 9 
08-05 09:52:45.082: E/AndroidRuntime(9680): FATAL EXCEPTION: main 
08-05 09:52:45.082: E/AndroidRuntime(9680): Process: com.example.vivzmultithreadingexample, PID: 9680 
08-05 09:52:45.082: E/AndroidRuntime(9680): java.lang.IllegalStateException: Could not execute method of the activity 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at android.view.View$1.onClick(View.java:3828) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at android.view.View.performClick(View.java:4443) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at android.view.View$PerformClick.run(View.java:18433) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at android.os.Handler.handleCallback(Handler.java:733) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at android.os.Handler.dispatchMessage(Handler.java:95) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at android.os.Looper.loop(Looper.java:136) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at android.app.ActivityThread.main(ActivityThread.java:5021) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at java.lang.reflect.Method.invoke(Method.java:515) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at dalvik.system.NativeStart.main(Native Method) 
08-05 09:52:45.082: E/AndroidRuntime(9680): Caused by: java.lang.reflect.InvocationTargetException 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at java.lang.reflect.Method.invoke(Method.java:515) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at android.view.View$1.onClick(View.java:3823) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  ... 11 more 
08-05 09:52:45.082: E/AndroidRuntime(9680): Caused by: android.os.NetworkOnMainThreadException 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at java.net.InetAddress.getAllByName(InetAddress.java:214) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at com.example.vivzmultithreadingexample.MainActivity.downloadImageUsingThread(MainActivity.java:68) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at com.example.vivzmultithreadingexample.MainActivity$DownloadImagesThread.run(MainActivity.java:108) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at java.lang.Thread.run(Thread.java:841) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  at com.example.vivzmultithreadingexample.MainActivity.downloadImage(MainActivity.java:48) 
08-05 09:52:45.082: E/AndroidRuntime(9680):  ... 14 more 

ответ

0

попробовать использовать эти заявления в рамках этой линии

connection =(HttpURLConnection) downloadUrl.openConnection(); 
connection.setRequestMethod("GET"); 
connection.connect(); 
0

Вы звоните Сетевой вызов в главном потоке, используйте Асинхронный Task для этого. Используйте этот код ..

DownLoadImageTask downloadImageUsingThread =new DownLoadImageTask(); 
downloadImageUsingThread.execute(listofImages[0]); 

и использовать весь код для загрузки изображения в doInBackground (String ... Params) метод asyntask и задать текст в методе пост.

class DownLoadImageTask extends Asyntask<String,String,String>{ 

@Override

protected String doInBackground(String... params) { 

// весь код идет ее

} 

@Override 
protected void onPostExecute(String result1) { 

// Устанавливаем текст здесь

}

}

enter code here 
0

Найдено решение. Просто изменилось myThread.run() в myThread.start()

1

Вы используете myThread.run() для вызова метода run() это будет выполняться run() в потоке, в котором он называется, в вашем случае это MainThread и Android не позволяют доступ к сети в MainThread. Вы должны позвонить myThread.start() за сообщение о выполнении вашей темы.